home *** CD-ROM | disk | FTP | other *** search
- /*
- File: Analysis.c
-
- Contains: Sample code for Language Analysis Manager.
-
- Version: Technology: System 8
- Release: Daruma Developer Release 1
-
- Copyright: 1998 by Apple Computer, Inc., all rights reserved
-
- Contact: daruma@apple.com
-
- */
-
-
- #include "TestApp.h"
- #include "FunctionProto.h"
-
- #include <TextUtils.h>
- #include <Memory.h>
- #include <AppleEvents.h>
- #include <Menus.h>
- #include <stdio.h>
- #include <string.h>
- #include <Script.h>
-
- #include <LanguageAnalysis.h>
- #include <JapaneseAnalysisEngine.h>
-
-
- // ========================================================================================
- // Prototypes for static functions
- // ========================================================================================
- static OSStatus CallLanguageAnalysis ( LAContextRef analysisContext, short analysisMode, short wholeStrLen, short inputStrLen, const char *inputStr, AEDesc *result, Boolean *modified );
- static void PrintPath( LAMorphemePath *thePath, short analysisClass );
- static void PrintStreamFromPath( LAMorphemePath *thePath );
- static void PrintStreamFromBundle( LAMorphemeBundle *theBundle, short number );
- static OSStatus GetStandalonePathFromBundle( LAMorphemeBundle *bundle, UInt16 index, LAMorphemePath *morphemePath );
-
-
- // ========================================================================================
- // SetUpAllAnalysisEnvironment
- // ========================================================================================
- OSStatus SetUpAllAnalysisEnvironment ( InputDialogPtr infoDialogPtr )
- {
- OSStatus err;
- UInt32 actualNumber, i;
- ControlRef control;
- LAEnvironmentRef *environmentList;
- Str63 environmentName;
- MenuHandle envMenuHandle = GetMenuHandle( kEnvironmentMenuID);
-
- // Get number of available environments
- err = LAGetEnvironmentList( 0, &actualNumber, NULL);
- nrequire( err, getEnvNum_Failure);
-
- // Allocate buffer for environment list
- environmentList = (LAEnvironmentRef *)NewPtrClear( sizeof(LAEnvironmentRef) * actualNumber);
- require_action( environmentList, allocEnvRef_Failure, err = memFullErr;);
-
- // Get environment list
- err = LAGetEnvironmentList( actualNumber, &actualNumber, environmentList);
- nrequire( err, getEnvRef_Failure);
-
- for ( i = 0; i < actualNumber; i++)
- {
- err = LAGetEnvironmentName( environmentList[i], environmentName);
- nrequire( err, getEnvName_Failure);
-
- AppendMenu( envMenuHandle, "\pDummy");
- SetMenuItemText( envMenuHandle, i + 1, environmentName);
- }
-
- control = (ControlRef)GetDialogItemHandle( infoDialogPtr->dialog, kEnvironPopupDItemID);
- SetControlMaximum( control, actualNumber);
-
- DisposePtr( (Ptr)environmentList);
-
- return noErr;
-
- //`````````````````````````````````````````````````````````````````````````````
- // Error handling
- //
- getEnvName_Failure:
- getEnvRef_Failure:
- DisposePtr( (Ptr)environmentList);
- allocEnvRef_Failure:
- getEnvNum_Failure:
- return err;
- }
-
-
- // ========================================================================================
- // SetAnalysisEnvironment
- // ========================================================================================
- OSStatus SetAnalysisEnvironment ( InputDialogPtr infoDialogPtr )
- {
- OSStatus err, specificErr;
- ControlRef control;
- short newEnvNum, level;
- Str63 envName;
-
- //------------------------------------------------------------------------------
- // Get dialog popup menu
- //
- control = (ControlRef)GetDialogItemHandle( infoDialogPtr->dialog, kEnvironPopupDItemID);
- newEnvNum = GetControlValue( control);
- GetMenuItemText( GetMenuHandle( kEnvironmentMenuID), newEnvNum, envName);
-
- //------------------------------------------------------------------------------
- // Close current analysis context
- //
- if ( infoDialogPtr->analysisContext != NULL)
- {
- err = LACloseContext( infoDialogPtr->analysisContext);
- nrequire( err, closeContext_Failure);
- }
-
- //------------------------------------------------------------------------------
- // Get new environment
- //
- err = LAGetEnvironmentRef( envName, &infoDialogPtr->environmentRef);
- nrequire( err, getEnvironment_Failure);
-
- //------------------------------------------------------------------------------
- // Open new analysis context
- //
- err = LAOpenContext( infoDialogPtr->environmentRef, &infoDialogPtr->analysisContext, &specificErr, NULL );
- nrequire( err, openContext_Failure);
-
- //------------------------------------------------------------------------------
- // Set level menu
- //
- UncheckAllMenuItems( kLevelMenuID);
-
- err = GetAnalysisLevel( infoDialogPtr, &level);
- nrequire( err, getProperty_Failure);
-
- if ( level == 0)
- CheckItem( GetMenuHandle( kLevelMenuID), kLevelZeroMenuItemID, true);
- else
- CheckItem( GetMenuHandle( kLevelMenuID), level + kLevelOneMenuItemID - 1, true);
-
- infoDialogPtr->curAnalysisClass = newEnvNum;
- infoDialogPtr->converted = false;
-
- return noErr;
-
- //`````````````````````````````````````````````````````````````````````````````
- // Error handling
- //
- getProperty_Failure:
- openContext_Failure:
- getEnvironment_Failure:
- closeContext_Failure:
- return err;
- }
-
-
- // ========================================================================================
- // DoMorphemeAnalysis
- // ========================================================================================
- OSStatus DoMorphemeAnalysis ( InputDialogPtr infoDialogPtr )
- {
- OSStatus err;
- Handle itemHandle;
- short inputStrLen, partialStrLen;
- Str255 inputStr, partialStr;
- LAContextRef analysisContext;
-
- //------------------------------------------------------------------------------
- // Initialize
- //
- if ( infoDialogPtr->analysisBundle.descriptorType != typeNull)
- AEDisposeDesc( &infoDialogPtr->analysisBundle);
-
- if ( infoDialogPtr->analysisPath.descriptorType != typeNull)
- AEDisposeDesc( &infoDialogPtr->analysisPath);
-
- //------------------------------------------------------------------------------
- // Get item string
- //
- itemHandle = GetDialogItemHandle( infoDialogPtr->dialog, kInputEditTextDItemID);
- GetDialogItemText( itemHandle, inputStr);
- inputStrLen = inputStr[0];
- PascalStrToCStr( inputStr);
-
- analysisContext = infoDialogPtr->analysisContext;
-
- //------------------------------------------------------------------------------
- // Call analysis function
- //
- if ( gAnalysisMode == kBatchAnalysisMode )
- {
- err = CallLanguageAnalysis( analysisContext, gAnalysisMode, inputStrLen, inputStrLen,
- (char *)inputStr, &infoDialogPtr->analysisBundle, NULL);
- nrequire( err, batchAnalysis_Failure);
-
- PrintStreamFromBundle( &infoDialogPtr->analysisBundle, 1);
- }
- else
- {
- Boolean modified;
- Handle strItemHandle;
- short charKind;
-
- partialStr[0] = '\0';
- strItemHandle = GetDialogItemHandle( infoDialogPtr->dialog, kInputStatTextDItemID);
- SetDialogItemText( strItemHandle, "\p");
-
- //
- // Handle 1-byte and 2-byte characters
- //
- for ( partialStrLen = 0; partialStrLen < inputStrLen; )
- {
- //
- // The target script (or locale) should be specified by environment.
- // For present, using Japanese script as a target script.
- //
- charKind = CharacterByteType( (char *)inputStr, partialStrLen, smJapanese);
-
- if ( charKind == smSingleByte)
- partialStrLen++;
- else if ( charKind == smFirstByte)
- partialStrLen += 2;
-
- BlockMoveData( inputStr, partialStr, partialStrLen);
- partialStr[partialStrLen] = '\0';
-
- CStrToPascalStr( (char *)partialStr);
- SetDialogItemText( strItemHandle, partialStr);
- PascalStrToCStr( partialStr);
-
- err = CallLanguageAnalysis( analysisContext, gAnalysisMode, inputStrLen,
- partialStrLen, (char *)partialStr,
- &infoDialogPtr->analysisPath, &modified);
- nrequire( err, continuousAnalysis_Failure);
-
- if ( modified)
- {
- PrintStreamFromPath( &infoDialogPtr->analysisPath);
- AEDisposeDesc( &infoDialogPtr->analysisPath);
- }
-
- partialStr[0] = '\0';
- }
-
- err = LAResetAnalysis( analysisContext);
- }
-
- return noErr;
-
- //`````````````````````````````````````````````````````````````````````````````
- // Error handling
- //
- continuousAnalysis_Failure:
- if ( infoDialogPtr->analysisPath.descriptorType != typeNull)
- AEDisposeDesc( &infoDialogPtr->analysisPath);
- batchAnalysis_Failure:
- closeContext_Failure:
- openContext_Failure:
- context_Failure:
- return err;
- }
-
-
- // ========================================================================================
- // CallLanguageAnalysis
- // ========================================================================================
- static OSStatus CallLanguageAnalysis ( LAContextRef analysisContext, short analysisMode,
- short wholeStrLen, short inputStrLen, const char *inputStr,
- AEDesc *result, Boolean *modified )
- {
- OSStatus err;
- LAMorphemePath *leadingEdge, *trailingEdge;
- Boolean modifyStatus;
-
- //------------------------------------------------------------------------------
- // Do analysis
- //
- if ( analysisMode == kBatchAnalysisMode)
- {
- //
- // Batch analysis
- //
- leadingEdge = (LAMorphemePath *)kLADefaultEdge;
- trailingEdge = (LAMorphemePath *)kLADefaultEdge;
-
- err = LAMorphemeAnalysis( analysisContext, inputStr, inputStrLen, leadingEdge,
- trailingEdge, kNumResult, result);
- nrequire( err, batchAnalysis_Failure);
- }
- else
- {
- //
- // Continuous analusis
- //
- leadingEdge = (LAMorphemePath *)kLADefaultEdge;
- if ( inputStrLen == wholeStrLen)
- trailingEdge = (LAMorphemePath *)kLADefaultEdge;
- else
- trailingEdge = (LAMorphemePath *)kLAIncompleteEdge;
-
- err = LAContinuousMorphemeAnalysis( analysisContext, inputStr, inputStrLen, false,
- leadingEdge, trailingEdge, &modifyStatus);
- nrequire( err, continuousAnalysis_Failure);
-
- //
- // Update display every time when internal analysis state is changed
- //
- if ( modifyStatus)
- {
- err = LAGetMorphemes( analysisContext, result);
- nrequire( err, getMorpheme_Failure);
- }
-
- if ( modified != NULL)
- *modified = modifyStatus;
- }
-
- return noErr;
-
- //`````````````````````````````````````````````````````````````````````````````
- // Error handling
- //
- getMorpheme_Failure:
- continuousAnalysis_Failure:
- batchAnalysis_Failure:
- return err;
- }
-
-
- // ========================================================================================
- // ReleaseAnalysisEnvironment
- // ========================================================================================
- OSStatus ReleaseAnalysisContext ( InputDialogPtr infoDialogPtr )
- {
- OSStatus err;
-
- //------------------------------------------------------------------------------
- // Close current analysis context
- //
- if ( infoDialogPtr->analysisContext != NULL)
- {
- err = LACloseContext( infoDialogPtr->analysisContext);
- nrequire( err, closeContext_Failure);
- }
-
- return noErr;
-
- //`````````````````````````````````````````````````````````````````````````````
- // Error handling
- //
- closeContext_Failure:
- return err;
- }
-
-
- // ========================================================================================
- // GetAnalysisLevel
- // ========================================================================================
- OSStatus GetAnalysisLevel ( InputDialogPtr infoDialogPtr, short *level )
- {
- OSStatus err;
- long actualSize;
- DescType typeCode;
- AERecord propertyContainer = { typeNull, NULL};
-
- err = LAGetEnvironmentProperty( infoDialogPtr->environmentRef, keyAELAAnalysisLevel,
- &propertyContainer);
- nrequire( err, getProperty_Failure);
-
- err = AEGetKeyPtr( &propertyContainer, keyAELAAnalysisLevel, typeAELAEnvAnalysisLevel,
- &typeCode, level, sizeof(short), &actualSize);
- nrequire( err, getLevel_Failure);
-
- AEDisposeDesc( &propertyContainer);
-
- return noErr;
-
- //`````````````````````````````````````````````````````````````````````````````
- // Error handling
- //
- getLevel_Failure:
- AEDisposeDesc( &propertyContainer);
- getProperty_Failure:
- return err;
- }
-
-
- // ========================================================================================
- // SetAnalysisLevel
- // ========================================================================================
- OSStatus SetAnalysisLevel ( InputDialogPtr infoDialogPtr, short level )
- {
- OSStatus err, specificErr;
- AERecord propertyContainer = { typeNull, NULL};
-
- err = AECreateList( NULL, 0L, true, &propertyContainer);
- nrequire( err, createContainer_Failure);
-
- err = AEPutKeyPtr( &propertyContainer, keyAELAAnalysisLevel, typeAELAEnvAnalysisLevel,
- &level, sizeof( level));
- nrequire( err, addLevel_Failure);
-
- err = LASetEnvironmentProperty( infoDialogPtr->environmentRef, keyAELAAnalysisLevel,
- &propertyContainer, &specificErr);
- nrequire( err, setProperty_Failure);
-
- AEDisposeDesc( &propertyContainer);
-
- return noErr;
-
- //`````````````````````````````````````````````````````````````````````````````
- // Error handling
- //
- setProperty_Failure:
- addLevel_Failure:
- AEDisposeDesc( &propertyContainer);
- createContainer_Failure:
- return err;
- }
-
-
- /* ========================================================================================
- Routine: PrintBundle
-
- Purpose: Print a bundle using GetStandalonePathFromBundle().
-
- Warnings:
- ======================================================================================== */
- void
- PrintBundle(
- LAMorphemeBundle *theBundle,
- short analysisClass,
- short number
- )
- {
- OSStatus err;
- long i, begin, end;
- AEDescList morphemePathList = { typeNull, NULL};
- AERecord morphemePath = { typeNull, NULL};
- long pathCount;
-
- //------------------------------------------------------------------------------
- // Count path in the morpheme path list
- //
- err = AEGetKeyDesc( theBundle, keyAELAMorphemePath, typeAEList, &morphemePathList);
- if ( err != noErr) goto errExit;
-
- err = AECountItems( &morphemePathList, &pathCount);
- if ( pathCount == 0)
- {
- PutCStringConsoleWindow( gConsoleWindow, "There is no path.\n");
- goto errExit;
- }
-
- if ( number == 0)
- {
- begin = 1;
- end = pathCount;
- }
- else if ( number > pathCount)
- {
- PutCStringConsoleWindow( gConsoleWindow, "There is no more text\n");
- goto errExit;
- }
- else
- {
- begin = end = number;
- }
-
- PutCStringConsoleWindow( gConsoleWindow, "\n");
-
- for ( i = begin; i <= end; i++)
- {
- err = GetStandalonePathFromBundle( theBundle, i, &morphemePath);
- if ( err != noErr) goto errExit;
-
- PrintPath( &morphemePath, analysisClass);
- AEDisposeDesc( &morphemePath);
-
- PutCStringConsoleWindow( gConsoleWindow, "\n");
- }
-
- AEDisposeDesc( &morphemePathList);
-
- return;
-
- errExit:
- AEDisposeDesc( &morphemePath);
- AEDisposeDesc( &morphemePathList);
- }
-
-
- /* ========================================================================================
- Routine: PrintStreamFromBundle
-
- Purpose: Print a particular result specified by number in the bundle.
-
- Warnings:
- ======================================================================================== */
- void
- PrintStreamFromBundle(
- LAMorphemeBundle *theBundle,
- short number
- )
- {
- OSStatus err;
- long i, j, begin, end, numItems, morphemeIndex;
- long morphemeNum;
- AEDescList morphemeNodeList = { typeNull, NULL};
- AEDescList morphemePathList = { typeNull, NULL};
- AEDescList morphemeIndexList = { typeNull, NULL};
- AERecord morphemePath = { typeNull, NULL};
- AERecord morpheme = { typeNull, NULL};
- AEDescList homographList = { typeNull, NULL};
- AERecord homograph = { typeNull, NULL};
- AEKeyword theAEKeyword;
- DescType typeCode;
- long actualSize;
- char dataStr[kSizeOfAnalysis];
- char resultStr[kSizeOfAnalysis];
-
- //------------------------------------------------------------------------------
- // Get morpheme node list
- //
- err = AEGetKeyDesc( theBundle, keyAELAMorpheme, typeAEList, &morphemeNodeList);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Get morpheme path list
- //
- err = AEGetKeyDesc( theBundle, keyAELAMorphemePath, typeAEList, &morphemePathList);
- if ( err != noErr) goto errExit;
-
- AECountItems( &morphemePathList, &numItems);
-
- if ( number == 0)
- {
- begin = 1;
- end = numItems;
- }
- else if ( number > numItems)
- {
- PutCStringConsoleWindow( gConsoleWindow, "There is no more text\n");
- goto errExit;
- }
- else
- {
- begin = end = number;
- }
-
- for ( i = begin; i <= end; i++)
- {
- resultStr[0] = 0;
-
- //------------------------------------------------------------------------------
- // Get morpheme path from morpheme path list one by one
- //
- err = AEGetNthDesc( &morphemePathList, i, typeAERecord, &theAEKeyword, &morphemePath);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Get morpheme index list from morpheme path
- //
- err = AEGetKeyDesc( &morphemePath, keyAELAMorpheme, typeAEList, &morphemeIndexList);
- AEDisposeDesc( &morphemePath);
- if ( err != noErr) goto errExit;
-
- err = AECountItems( &morphemeIndexList, &morphemeNum);
-
- for ( j = 1; j <= morphemeNum; j++)
- {
- //------------------------------------------------------------------------------
- // Get morpheme index from morpheme index list one by one
- //
- err = AEGetNthPtr( &morphemeIndexList, j, typeInteger, &theAEKeyword, &typeCode,
- &morphemeIndex, sizeof(morphemeIndex), &actualSize);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Get morpheme node, specified by index, from morpheme node list
- //
- err = AEGetNthDesc( &morphemeNodeList, morphemeIndex, typeAERecord, &theAEKeyword,
- &morpheme);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Get homograph list from morpheme node
- //
- err = AEGetKeyDesc( &morpheme, keyAELAHomograph, typeAEList, &homographList);
- AEDisposeDesc( &morpheme);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Get homograph node from homograph list
- //
- err = AEGetNthDesc( &homographList, 1, typeAERecord, &theAEKeyword, &homograph);
- AEDisposeDesc( &homographList);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Get data string (hyoki or yomi) from homograph node
- //
- err = AEGetKeyPtr( &homograph, keyAEText, typeChar, &typeCode, dataStr,
- kSizeOfAnalysis, &actualSize);
- AEDisposeDesc( &homograph);
- if ( err != noErr) goto errExit;
-
- dataStr[actualSize] = '\0';
- strcat( resultStr, dataStr);
- }
-
- AEDisposeDesc( &morphemeIndexList);
-
- strcat( resultStr, "\n");
- PutCStringConsoleWindow( gConsoleWindow, resultStr);
- }
-
- AEDisposeDesc( &morphemePathList);
- AEDisposeDesc( &morphemeNodeList);
-
- return;
-
- //`````````````````````````````````````````````````````````````````````````````
- // Error handling
- //
- errExit:
- if ( morphemeNodeList.descriptorType != typeNull)
- AEDisposeDesc( &morphemeNodeList);
- if ( morphemePathList.descriptorType != typeNull)
- AEDisposeDesc( &morphemePathList);
- if ( morphemeIndexList.descriptorType != typeNull)
- AEDisposeDesc( &morphemeIndexList);
- if ( morphemePath.descriptorType != typeNull)
- AEDisposeDesc( &morphemePath);
- if ( morpheme.descriptorType != typeNull)
- AEDisposeDesc( &morpheme);
- if ( homographList.descriptorType != typeNull)
- AEDisposeDesc( &homographList);
- if ( homograph.descriptorType != typeNull)
- AEDisposeDesc( &homograph);
- }
-
-
- /* ========================================================================================
- Routine: PrintPath
-
- Purpose: Print a particular result specified by number in the path.
-
- Warnings:
- ======================================================================================== */
- void
- PrintPath(
- LAMorphemePath *thePath,
- short analysisClass
- )
- {
- OSStatus err;
- long i, j;
- long morphemeNum, homographNum;
- AEDescList morphemeNodeList = { typeNull, NULL};
- AERecord morpheme = { typeNull, NULL};
- AEDescList homographList = { typeNull, NULL};
- AERecord homograph = { typeNull, NULL};
- AEDesc categoryDesc = { typeNull, NULL};
- UInt32 categoryCode;
- AEKeyword theAEKeyword;
- DescType typeCode;
- long actualSize;
- char dataStr[kSizeOfAnalysis];
- char sourceStr[kSizeOfAnalysis];
- char categoryName[kMaxCategoryNameLength];
- MorphemeTextRange textRange;
- HomographWeight weight;
- HomographAccent accent;
- char resultStr[kSizeOfAnalysis];
- char delimiter;
-
- //------------------------------------------------------------------------------
- // Get source string from path
- //
- err = AEGetKeyPtr( thePath, keyAEText, typeChar, &typeCode, sourceStr,
- kSizeOfAnalysis, &actualSize);
- if ( err != noErr) goto errExit;
-
- sourceStr[actualSize] = '\0';
-
- //------------------------------------------------------------------------------
- // Get morpheme list from morpheme path
- //
- err = AEGetKeyDesc( thePath, keyAELAMorpheme, typeAEList, &morphemeNodeList);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Count morphemes
- //
- err = AECountItems( &morphemeNodeList, &morphemeNum);
- if ( err != noErr) goto errExit;
-
- PutCStringConsoleWindow( gConsoleWindow, "\n");
-
- //------------------------------------------------------------------------------
- // Print path info
- //
- sprintf( resultStr, "%3ld morphemes\n", morphemeNum );
- PutCStringConsoleWindow( gConsoleWindow, resultStr);
-
- for ( i = 1; i <= morphemeNum; i++)
- {
- //------------------------------------------------------------------------------
- // Get morpheme node, specified by index, from morpheme node list
- //
- err = AEGetNthDesc( &morphemeNodeList, i, typeAERecord, &theAEKeyword, &morpheme);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Get text range info from morpheme node
- //
- err = AEGetKeyPtr( &morpheme, keyAEMorphemeTextRange, typeAEMorphemeTextRange,
- &typeCode, &textRange, sizeof(textRange), &actualSize);
- if ( err != noErr) goto errExit;
- strncpy( dataStr, sourceStr + textRange.sourceOffset, textRange.length);
- dataStr[ textRange.length ] = '\0';
-
- //------------------------------------------------------------------------------
- // Get category name by coercing category code to text
- //
- err = AEGetKeyPtr( &morpheme, keyAEMorphemeCategoryCode, typeAEMorphemeCategoryCode,
- &typeCode, &categoryCode, sizeof(categoryCode), &actualSize);
- if ( err != noErr) goto errExit;
-
- err = AECoercePtr( typeAEMorphemeCategoryCode, &categoryCode, sizeof(categoryCode),
- typeChar, &categoryDesc);
- if ( err != noErr) goto errExit;
-
- actualSize = GetHandleSize( categoryDesc.dataHandle);
- BlockMoveData( *categoryDesc.dataHandle, categoryName, actualSize);
- AEDisposeDesc( &categoryDesc);
- categoryName[actualSize] = '\0';
-
- //------------------------------------------------------------------------------
- // Print morpheme info
- //
- sprintf( resultStr, "** %2d: %-16s : %-20s ", i, dataStr, categoryName);
- PutCStringConsoleWindow( gConsoleWindow, resultStr);
-
- //------------------------------------------------------------------------------
- // Get homograph list from morpheme node
- //
- err = AEGetKeyDesc( &morpheme, keyAELAHomograph, typeAEList, &homographList);
- AEDisposeDesc( &morpheme);
- if ( err != noErr) goto errExit;
-
- err = AECountItems( &homographList, &homographNum);
-
- for ( j = 1; j <= homographNum; j++)
- {
- //------------------------------------------------------------------------------
- // Get homograph node from homograph list
- //
- err = AEGetNthDesc( &homographList, j, typeAERecord, &theAEKeyword, &homograph);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Get data string (surface string or yomi) from homograph node
- //
- err = AEGetKeyPtr( &homograph, keyAEText, typeChar, &typeCode, dataStr,
- kSizeOfAnalysis, &actualSize);
- if ( err != noErr) goto errExit;
- dataStr[actualSize] = '\0';
-
- //------------------------------------------------------------------------------
- // Get weight (frequency) from homograph node
- //
- err = AEGetKeyPtr( &homograph, keyAEHomographWeight, typeAEHomographWeight, &typeCode,
- &weight, sizeof( weight), &actualSize);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Get accent from homograph node (TTS mode only)
- //
- if ( analysisClass == kTTSMenuItemID)
- {
- err = AEGetKeyPtr( &homograph, keyAEHomographAccent, typeAEHomographAccent, &typeCode,
- &accent, sizeof( accent), &actualSize);
- if ( err != noErr) goto errExit;
- }
-
- delimiter = ( j == homographNum ? ' ' : ',');
- if ( analysisClass == kTTSMenuItemID)
- {
- sprintf( resultStr, "%s(%d, %d)%c ", dataStr, weight, accent, delimiter);
- }
- else
- {
- sprintf( resultStr, "%s(%d)%c ", dataStr, weight, delimiter);
- }
- PutCStringConsoleWindow( gConsoleWindow, resultStr);
-
- AEDisposeDesc( &homograph);
- }
- PutCStringConsoleWindow( gConsoleWindow, "\n");
-
- AEDisposeDesc( &homographList);
- }
- PutCStringConsoleWindow( gConsoleWindow, "\n");
-
- AEDisposeDesc( &morphemeNodeList);
-
- return;
-
- //`````````````````````````````````````````````````````````````````````````````
- // Error handling
- //
- errExit:
- if ( morphemeNodeList.descriptorType != typeNull)
- AEDisposeDesc( &morphemeNodeList);
- if ( morpheme.descriptorType != typeNull)
- AEDisposeDesc( &morpheme);
- if ( homographList.descriptorType != typeNull)
- AEDisposeDesc( &homographList);
- if ( homograph.descriptorType != typeNull)
- AEDisposeDesc( &homograph);
- }
-
-
- /* ========================================================================================
- Routine: PrintStreamFromPath
-
- Purpose: Print a result in the standalone path.
-
- Warnings:
- ======================================================================================== */
- void
- PrintStreamFromPath(
- LAMorphemePath *thePath
- )
- {
- OSStatus err;
- long i, morphemeNum;
- AEDescList morphemeNodeList = { typeNull, NULL};
- AERecord morpheme = { typeNull, NULL};
- AEDescList homographList = { typeNull, NULL};
- AERecord homograph = { typeNull, NULL};
- AEKeyword theAEKeyword;
- DescType typeCode;
- long actualSize;
- char dataStr[kSizeOfAnalysis];
- char resultStr[kSizeOfAnalysis];
-
- //------------------------------------------------------------------------------
- // Get morpheme list from morpheme path
- //
- err = AEGetKeyDesc( thePath, keyAELAMorpheme, typeAEList, &morphemeNodeList);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Count morphemes
- //
- err = AECountItems( &morphemeNodeList, &morphemeNum);
- if ( err != noErr) goto errExit;
-
- for ( resultStr[0] = 0, i = 1; i <= morphemeNum; i++)
- {
- //------------------------------------------------------------------------------
- // Get morpheme node, specified by index, from morpheme node list
- //
- err = AEGetNthDesc( &morphemeNodeList, i, typeAERecord, &theAEKeyword, &morpheme);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Get homograph list from morpheme node
- //
- err = AEGetKeyDesc( &morpheme, keyAELAHomograph, typeAEList, &homographList);
- AEDisposeDesc( &morpheme);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Get homograph node from homograph list
- //
- err = AEGetNthDesc( &homographList, 1, typeAERecord, &theAEKeyword, &homograph);
- AEDisposeDesc( &homographList);
- if ( err != noErr) goto errExit;
-
- //------------------------------------------------------------------------------
- // Get data string (surface string or yomi) from homograph node
- //
- err = AEGetKeyPtr( &homograph, keyAEText, typeChar, &typeCode, dataStr,
- kSizeOfAnalysis, &actualSize);
- AEDisposeDesc( &homograph);
- if ( err != noErr) goto errExit;
-
- dataStr[actualSize] = '\0';
- strcat( resultStr, dataStr);
- }
-
- strcat( resultStr, "\n");
- PutCStringConsoleWindow( gConsoleWindow, resultStr);
-
- AEDisposeDesc( &morphemeNodeList);
-
- return;
-
- //`````````````````````````````````````````````````````````````````````````````
- // Error handling
- //
- errExit:
- if ( homographList.descriptorType != typeNull)
- AEDisposeDesc( &homographList);
- if ( homograph.descriptorType != typeNull)
- AEDisposeDesc( &homograph);
- if ( morpheme.descriptorType != typeNull)
- AEDisposeDesc( &morpheme);
- if ( morphemeNodeList.descriptorType != typeNull)
- AEDisposeDesc( &morphemeNodeList);
- }
-
-
- /* ========================================================================================
- Routine: GetStandalonePathFromBundle
-
- Purpose: Get the specified path from bundle structure.
-
- Warnings:
- ======================================================================================== */
- static OSStatus
- GetStandalonePathFromBundle(
- LAMorphemeBundle *bundle,
- UInt16 index,
- LAMorphemePath *morphemePath
- )
- {
- OSStatus err;
- AEKeyword theAEKeyword;
- AEDescList morphemeNodeList;
- AEDescList bundleNodeList, bundlePathList, bundleIndexList;
- AEDesc tempDesc, morpheme;
- DescType typeCode;
- long actualSize, morphemeNum, morphemeIndex, i;
- AERecord bundlePath;
-
- //------------------------------------------------------------------------------
- // Create morpheme path
- //
- err = AECreateList( NULL, 0L, true, morphemePath);
- nrequire( err, createMorphemePath_Failure);
-
- //------------------------------------------------------------------------------
- // Copy bundle's source text to morpheme path
- //
- err = AEGetKeyDesc( bundle, keyAEText, typeChar, &tempDesc);
- nrequire( err, getSourceStr_Failure);
-
- err = AEPutKeyDesc( morphemePath, keyAEText, &tempDesc);
- AEDisposeDesc( &tempDesc);
- nrequire( err, setSourceStr_Failure);
-
- //------------------------------------------------------------------------------
- // Create new morpheme node list
- //
- err = AECreateList( NULL, 0L, false, &morphemeNodeList);
- nrequire( err, createMorphemeNodeList_Failure);
-
- //------------------------------------------------------------------------------
- // Get bundle's morpheme node list
- //
- err = AEGetKeyDesc( bundle, keyAELAMorpheme, typeAEList, &bundleNodeList);
- nrequire( err, getBundleNodeList_Failure);
-
- //------------------------------------------------------------------------------
- // Get bundle's morpheme path list
- //
- err = AEGetKeyDesc( bundle, keyAELAMorphemePath, typeAEList, &bundlePathList);
- nrequire( err, getBundlePathList_Failure);
-
- //------------------------------------------------------------------------------
- // Get specified bundle's path
- //
- err = AEGetNthDesc( &bundlePathList, index, typeAERecord, &theAEKeyword, &bundlePath);
- AEDisposeDesc( &bundlePathList);
- nrequire( err, getBundlePath_Failure);
-
- //------------------------------------------------------------------------------
- // Get path's morpheme list
- //
- err = AEGetKeyDesc( &bundlePath, keyAELAMorpheme, typeAEList, &bundleIndexList);
- AEDisposeDesc( &bundlePath);
- nrequire( err, getBundleIndexList_Failure);
-
- //------------------------------------------------------------------------------
- // Get bundle's morpheme list from path
- //
- err = AECountItems( &bundleIndexList, &morphemeNum);
- nrequire( err, getMorphemeCount_Failure);
-
- //------------------------------------------------------------------------------
- // Copy all morpheme node
- //
- for ( i = 1; i <= morphemeNum; i++)
- {
- //------------------------------------------------------------------------------
- // Get morpheme index from morpheme index list one by one
- //
- err = AEGetNthPtr( &bundleIndexList, i, typeInteger, &theAEKeyword, &typeCode,
- &morphemeIndex, sizeof(morphemeIndex), &actualSize);
- nrequire( err, getMorphemeIndex_Failure);
-
- //------------------------------------------------------------------------------
- // Get morpheme node, specified by index, from morpheme node list
- //
- err = AEGetNthDesc( &bundleNodeList, morphemeIndex, typeAERecord, &theAEKeyword,
- &morpheme);
- nrequire( err, getMorphemeNode_Failure);
-
- //------------------------------------------------------------------------------
- // Copy morpheme node
- //
- err = AEPutDesc( &morphemeNodeList, 0, &morpheme);
- AEDisposeDesc( &morpheme);
- nrequire( err, putMorphemeNode_Failure);
- }
-
- //------------------------------------------------------------------------------
- // Add morpheme node list to morpheme path
- //
- err = AEPutKeyDesc( morphemePath, keyAELAMorpheme, &morphemeNodeList);
- nrequire( err, addMorphemeListToPath_Failure);
-
- AEDisposeDesc( &bundleIndexList);
- AEDisposeDesc( &bundleNodeList);
- AEDisposeDesc( &morphemeNodeList);
-
- return noErr;
-
- //`````````````````````````````````````````````````````````````````````````````
- // Error handling
- //
- addMorphemeListToPath_Failure:
- putMorphemeNode_Failure:
- getMorphemeNode_Failure:
- getMorphemeIndex_Failure:
- getMorphemeCount_Failure:
- AEDisposeDesc( &bundleIndexList);
- getBundleIndexList_Failure:
- getBundlePath_Failure:
- getBundlePathList_Failure:
- AEDisposeDesc( &bundleNodeList);
- getBundleNodeList_Failure:
- AEDisposeDesc( &morphemeNodeList);
- createMorphemeNodeList_Failure:
- setSourceStr_Failure:
- getSourceStr_Failure:
- createMorphemePath_Failure:
- return err;
- }
-
-
-
-
-
-
-